package com.cictec.middleware.gps.engine.position.handler;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import com.cictec.middleware.commons.utils.Constants;
import com.cictec.middleware.commons.utils.DateUtils;
import com.cictec.middleware.commons.utils.log.MultiLog;
import com.cictec.middleware.gps.engine.BusInstance;
import com.cictec.middleware.gps.engine.TimingPoint;
import com.cictec.middleware.gps.engine.exception.BusPositionHandlerException;
import com.cictec.middleware.gps.engine.position.BusPositionHandler;
import com.cictec.middleware.gps.engine.utils.MultiLogUtil;

/**
 * 上下行判断
 * 
 * 根据设备上报的进出站数据，获取上下行 当前GPS数据的上下行与前一个数据保持一致
 * 
 * @author zhou qi
 *
 */
@Component
public class BusPositionLineTypeHandler implements BusPositionHandler {

	private Logger logger = LoggerFactory.getLogger(BusPositionLineTypeHandler.class);
	
	@Override
	public void onHandler(BusInstance busInstance) throws BusPositionHandlerException {

		MultiLog log = MultiLogUtil.getPositionJudgeLog(busInstance);
		log.debug("第四步 方向判断 ：获取上一步判定的lineType：{}", busInstance.getLineType());

		if (!busInstance.isInStandBy() && !busInstance.isLineTypeExist()) {
			log.debug("【方向判断】 ：根据上一个点判定当前点的方向");

			int timingPointSize = busInstance.getTimingSequential().size();
			if (timingPointSize >= 2) {
				// 上传的位置信息中包含的站点名是下一站的站点名，所以先查询出下一站的站点名，
				// 根据上一个数据判断当前数据
				TimingPoint prePoint = busInstance.getTimingPoint(-1);
				String preLineType = prePoint.getLineType();
				log.debug("【方向判断】 ：上一个点的时间：{}  时序节点数组长度：{}", DateUtils.formatDateTimes(prePoint.getTime()), timingPointSize);

				if (preLineType == null || preLineType == Constants.VAL_LINE_NOT_SPEC) {
					if (timingPointSize > 2) {
						TimingPoint preprePoint = busInstance.getTimingPoint(-2);
						preLineType = preprePoint.getLineType();
						log.debug("【方向判断】 ：上一个点的时间的线路类型为 null，取上上一个点的线路类型：{}", preLineType);

						if (timingPointSize > 3 && (preLineType == null || preLineType == Constants.VAL_LINE_NOT_SPEC)) {
							preprePoint = busInstance.getTimingPoint(-3);
							preLineType = preprePoint.getLineType();
							log.debug("【方向判断】 ：上二个点的时间的线路类型为 null，取上上上一个点的线路类型：{}", preLineType);
						}
					}
				}

				if (preLineType != null && preLineType != Constants.VAL_LINE_NOT_SPEC) {
					busInstance.setLineType(preLineType);
				} else {
					// 如果没有线路类型，可以认为属于偏线状态，直到第一个进出站出现出现
					busInstance.setLineType(Constants.VAL_LINE_NOT_SPEC);
				}
			} else {
				busInstance.setLineType(Constants.VAL_LINE_NOT_SPEC);
				log.debug("【方向判断】 ：busInstance.getTimingSequential().size() < 2, 不能够判定");
			}
		} else {
			log.debug("【方向判断】 ：存在方向");
		}

		logger.debug("【方向判断】线路类型：{}", busInstance.getLineType());
		log.debug("【方向判断】线路类型：{}", busInstance.getLineType());
	}

}
